/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import java.io.IOException;
import java.util.ArrayList;

public class Lectura {
    
public String path = new String();
public String nombreEntity = new String();
public ArrayList<Nodo> datos = new ArrayList<Nodo>();
public ArrayList<String> entidades = new ArrayList<String>();
public ArrayList<NodoAt> atributos = new ArrayList<NodoAt>();
public ArrayList<NodoAt> tempAtt = new ArrayList<NodoAt>();
public ArrayList<File> hbm = new ArrayList<File>();
public ArrayList<Nodo> temp = new ArrayList<Nodo>();
public ArrayList<NodoETL> attributos = new ArrayList<NodoETL>();
public ArrayList<NodoEntidad> entidadArray = new ArrayList<NodoEntidad>();
public ArrayList<Nodo> metodos= new ArrayList<Nodo>();


    public Lectura(String path){
        
        this.path= path;  
        datos = new ArrayList();
        temp = new ArrayList();
        entidadArray.clear();
        attributos.clear();
        hbm.clear();
        metodos.clear();
        atributos.clear();
        entidades.clear();
        
                
        
    }
    
    /**
     * 
     * @param linea  = linea de texto enviada para obtener nombre y tipo
     * 
     * Metodo utilizado para recorrer una cadena de texto y obtener el tipo y 
     * nombre de los atributos de cada clase.
     * 
     * 
     */
    public void Separa(String linea)
    {
        String nombre = new String();
        String tipo= new String();
        String aux = new String();
        boolean  b =  false;
        boolean t = false;
          char[] cd = linea.toCharArray();
          
      
          for(int index = 0; index <linea.length(); index++ ){
      
           
          //el separador es un espacio en blanco, compara si el caracter es "" o ;(fin cadena);
            if(String.valueOf(linea.charAt(index)).equals(" ")== true || String.valueOf(linea.charAt(index)).equals(";")== true) {
               
                if(aux.equals("private")== true){
                    b= true;
                    aux = " ";
                }
                   // en caso contrario, verifica si es tipo
                else{
                    // si el tipo esta vacio.. la cadena identifica al tipo
                   if(tipo.isEmpty()&& nombre.isEmpty()&& b == true) 
                     {
                       tipo= aux;
                       t = true;
                       aux = " ";
                     }
                   else{
                       // Si el nombre esta vacio.. y el tipo no, la cadena
                       //es el nombre del atributo
                       if(nombre.isEmpty()== true && t== true)
                        {
                           nombre = aux;
                           aux= " ";
                           
                           //System.out.println( "entra ");
                         }
                       }  
                    }
                    
                    
                }
            else{
                 aux= aux + linea.charAt(index);
                }
             }
        AddData(nombre, tipo);
                //System.out.println("nombre:" + nombre+ " tipo "+ tipo);
                
        }
    
    
     public void SeparaMetodos(String linea, String entidad)
    {
        String nombre = new String();
        String tipo= new String();
        String aux = new String();
        boolean  b =  false;
        boolean t = false;
        char[] cd = linea.toCharArray();
        boolean s = false;
     //   linea = linea.replace("{","")  ;
      System.out.println("lineas"+ linea);
          for(int index = 0; index <linea.length(); index++ ){
      
           
          //el separador es un espacio en blanco, compara si el caracter es "" o ;(fin cadena);
            if(String.valueOf(linea.charAt(index)).equals(" ")== true ) {
               
                if(b== true && s == false){
                    s = true;
                    aux = "";
                }
                
                if(aux.equals("public")== true ){
                    b= true;
                    aux = " ";
                }
                
                        
                   // en caso contrario, verifica si es tipo
                else{
                    // si el tipo esta vacio.. la cadena identifica al tipo
                   if(tipo.isEmpty()&& b == true && s == true) 
                     {
                       System.out.println("aux" + aux);
                       tipo= aux;
                       t = true;
                       aux = " ";
                     }
                   
                         
                       }  
                    }
            else{
                 aux= aux + linea.charAt(index);
                }
             }
        metodos.add(new Nodo(tipo, entidad));
            // System.out.println("nombre:" + tipo+ " tipo "+ entidad);
                
        }
    
    
    
    public void AddData(String nombre, String tipo){
      //  System.out.println(nombre +" tipo adddata "+ tipo);
        datos.add(new Nodo(nombre,tipo));
           
    }
    
    /**
     * 
     * @param path = direccion en la cual se localiza el archivo java a leer
     * @param entidad = nombre de la entidad
     */
    public void ReadEntity(String path, String entidad){
       boolean f = false;
        try {
           
           File archivo = new File(path+"/"+entidad);
          // System.out.print(archivo.getAbsolutePath());
           //JOptionPane.showMessageDialog(null,archivo.getAbsolutePath());
           FileReader fr = new FileReader(archivo);
           BufferedReader br = new BufferedReader(fr);
           String entrada = new String();
           nombreEntity = entidad;
           
            while((entrada=br.readLine())!=null){
                //System.out.println("entrada "+entrada);
                if(IsBeginEnd(entrada)== true){
                    if(f == false){
                        f = true;                       
                    }
                    else{
                        br.close();
                    }
                    
                }
                 if(entrada.contains("get")== true){
                     SeparaMetodos(entrada, entidad);
                    // metodos.add(new Nodo(entrada,entidad));
                    System.out.println(entrada + " "+entidad);
                 }
                else{
                    if(IsAtribute(entrada)== true)
                    {
                        Separa(entrada);
                    }   
                }
              //  System.out.println(entrada);
                                                                     
           }     
        } catch (IOException ex) {
            
        }
       
       SetData(GetArray(datos),entidad);
       datos.clear();
       
    }
    
    
    public ArrayList<Nodo> GetMetodos(){
        return metodos;
    }
    public boolean IsAtribute(String data)
     {
         boolean flag = false;
         if(data.contains("private"))
         {
             flag = true;
         }
         
        return flag;
     }
    
    public boolean IsBeginEnd(String data)
    {
        boolean flag= false;        
        if(data.contains("public class")|| data.equals("public"+ nombreEntity))       
        {
            flag = true;
        }
        return flag;
        
    }
    
    //Devuelve el array enviado..
    public ArrayList<Nodo> GetArray(ArrayList<Nodo> n ){
        
        return n;
        
    }
    
   
    
    public void GetFiles(File files){
        String[] ficheros= files.list();
        ArrayList<String> hmb = new ArrayList();
        
        int cont = 0;
        String aux; 
        for(int x = 0; x<ficheros.length; x++){
             
            if(ficheros[x].contains(".hbm.xml")){
                hmb.add(ficheros[x]);
                
               
                cont++;
            }
            if(ficheros[x].contains(".java")){
                
                for(int h = 0; h<hmb.size(); h++){
                    aux = GetName(hmb.get(h));
                    
                    if(ficheros[x].equals(aux+".java")== true){
                        entidades.add(ficheros[x]);
                        
                      
                    }
                }
            }
            
        }
        Get(files.getAbsolutePath());
    }
    
    
    public ArrayList<NodoEntidad> GetEntidades(){
        return entidadArray;
    }
    
    
    //Busca dentor de un directorio, los archivos de configuracion
    public void GetTwo(File files){
        
         File[] ficheros= files.listFiles();
        ArrayList<String> hmb = new ArrayList();
        
        int cont = 0;
        String aux; 
        
        for(int x = 0; x<ficheros.length; x++){
             
            if(ficheros[x].getName().contains(".hbm.xml")){
                hmb.add(ficheros[x].getName());
                hbm.add(ficheros[x]);
                }
            if(ficheros[x].getName().contains(".java")){
                
                for(int h = 0; h<hmb.size(); h++){
                    aux = GetName(hmb.get(h));
                    
                    if(ficheros[x].getName().equals(aux+".java")== true){
                        entidades.add(ficheros[x].getName());
                        entidadArray.add(new NodoEntidad(ficheros[x].getName(),files.getName()));
                        //System.out.println("entra if 2"+ficheros[x].getName() + files.getName());
                    }
                }
            }
            
            if(ficheros[x].getName().contains("Util.java"))
            {
                   entidadArray.add(new NodoEntidad(ficheros[x].getName(), files.getName()));
            }
            
            
        }
        Get(files.getAbsolutePath());
        
        
        
    }
    
   //Lee las entidades y separa los datos en dado caso se necesite
    public void Get(String dir ){
        for(int index = 0; index<entidades.size(); index++){
            
            ReadEntity(dir, entidades.get(index));
            
        }
        
        for ( int in = 0; in <hbm.size() ; in++){
            ReadHbm(hbm.get(in));
        }
        
               
        
    }
    
    public void GetEntityText(){
        for (int index = 0; index < entidades.size(); index++){
      
        }
    }
    
    public ArrayList<String> GetEntity(){
        return entidades;
    }
    
    public String GetName(String data){
        
        String names= new String();
        boolean p = false;
        for(int index = 0; index < data.length(); index ++  ){
            if(String.valueOf(data.charAt(index)).equals(".")== true)
            {
                index= data.length();
                p = true;
             }
            else{
                if(p == false)
                {
                    names = names+data.charAt(index);
                }
            }
         }
        return names;
        
    }
    
    
    public void SetData(ArrayList<Nodo> nodo , String entidad){
        for(int index = 0; index < nodo.size(); index++){
        atributos.add(new NodoAt(nodo.get(index).GetName(), nodo.get(index).GetTipo(),entidad));
        }
    } 
    
    public ArrayList<NodoAt> GetData(){
        return atributos;
    }
    
    /**
     * 
     * @param files = archivo de tipo file, que contiene los archivos /directorio
     * 
     * recorre y busca dentro de cada carpeta las entidades y archivos necesarios
     * para la configuración
     */
    public void Busca(File files){
        File[] dire =files.listFiles();
        
        
        for(int index = 0; index < dire.length; index++)
          {
             if(dire[index].isDirectory() == true)
              {
                Busca(dire[index]);   
                      }
           }
        
         GetTwo(files);
       }
    
    
    public boolean IsDirectory(String data){
        boolean b = true;
        if(data.contains(".")){
            b = false;
        }
       
        return b;
        
    }
    
    public boolean IsFile(String data){
        boolean b = false;
        
        if( data.contains("."))
        {
            b = true;
        }
        return b;
        
    }
    
    public void GetLength(){
        
       for(int index = 0; index < hbm.size(); index++) {
           
       } 
    }
    
    public void ReadHbm(File archivo) {
        
        boolean f = false;
        try {
           
          
           FileReader fr = new FileReader(archivo);
           BufferedReader br = new BufferedReader(fr);
           String entrada = new String();
          
            while((entrada=br.readLine())!=null)
               {
                
                if(entrada.contains("column")== true){
                   
                    SeparaL(entrada);
                }
                }
            
                                                                     
                
        } catch (IOException ex) {
            
        }
       
       SetHbm(GetArray(temp),GetName(archivo.getName()));
       temp.clear();
       
       }
    
    
    public void SeparaL(String linea)
    {
       // String linea = nlinea.trim();
        String nombre = new String();
        String aux = new String();
        String longit = new String();
        int longi = 0;
        boolean  c =  false;
        boolean t = false;
        boolean n = false;
        boolean len = false;
        boolean nom = false;
        //char[] cd = linea.toCharArray();
          
        
           
      
           for(int index = 0; index <linea.length(); index++ )
          { // for
              
              
           if(aux.equals("name=")== true && c == true)
             {
                    n = true;
                   // System.out.println("name  " + aux);
                    aux= "";
                    
              }
            
            
           else 
           { // else 1
              if(String.valueOf(linea.charAt(index)).equals(" ")== true //|| linea.charAt(index)== '"' 
             // String.valueOf(linea.charAt(index)).equals(" ")== true|| 
                      )
                { // if 1
                  if(aux.equals("<column")== true && c == false)
                   {
                    c= true;
                    //System.out.println("columna " + aux);
                    aux = "";
                  
                   }
                
                  else
                     { // else 2
                    //column ha sido leida, name ha sido leido.
                    //valor de la etiqueta aun no
                     if(c == true && n== true && nom == false)
                        {
                        nombre= aux.toLowerCase();
                       //System.out.println("nombre valor "+nombre);
                        aux= "";
                        nom = true;
                        }
                     else
                        { // else 3
                     // reconoce etiqueta length
                          if(aux.equals("length=")== true)
                           {
                             len = true;
                             //System.out.println("long" + aux);
                             aux = "";
                        
                           }
                          else
                            {
                            if(len== true && nom == true)
                            {
                             longit = aux.replace('"',' ').trim();   
                             //System.out.println(longit.replace('"',' ').trim());   
                             
                             //longi = Integer.parseInt(aux);
                             aux= "";
                             }
                        }     
                     
                    }// else.. 3             
                  } // else 2
                 
                }// if 1
              else{
                 
                  aux = aux + linea.charAt(index);
                  
               }
              // else 1
              if(aux.equals("length=")== true && nom== true){
                len = true;
               // System.out.println(aux.trim());
                aux= "";
            }
              } // for
             }
           AddDatos(nombre,longit);
    }
    
     public void AddDatos(String nombre, String longi){
             temp.add(new Nodo(nombre.replace('"',' '), longi));
         
    }
     
     public void SetHbm(ArrayList<Nodo> dato, String entidad){
       //  System.out.print(" set hbm");
         for(int x = 0; x<dato.size(); x++){
             tempAtt.add(new NodoAt(dato.get(x).GetName(), dato.get(x).GetTipo(), entidad));
           //  System.out.println("nombre "+ dato.get(x).GetName() );
             
             
         }
     }
     
    public ArrayList<Nodo> GetTemp() {
        
        return temp;
    }
    
    public  void SetLongi(ArrayList<NodoAt> tipos, ArrayList<NodoAt> longitudes)
    {
       // System.out.println("setlongi");
        for(int index = 0; index < tipos.size(); index++){
//                    System.out.println("nombre "+ tipos.get(index).GetName() + " ");
//                    System.out.println("tipo"+ tipos.get(index).GetTipo()+ " ");
//                    System.out.println("longitud "+ longitudes.get(index).GetTipo()+ " ");
//                    System.out.println("entidad "+ tipos.get(index).GetEntity() + " ");
            //si el nombre de la entidad es igual al nombre de la entidad enviada
            if(longitudes.get(index).GetEntity().equals(GetName(tipos.get(index).GetEntity()))== true)
            {
                if(longitudes.get(index).GetName().equals(tipos.get(index).GetName())== true){
                    attributos.add(new NodoETL(tipos.get(index).GetName(),tipos.get(index).GetTipo(),
                    tipos.get(index).GetEntity(), Integer.parseInt(longitudes.get(index).GetTipo())));
                    
//                    
//                    System.out.print("nombre "+ tipos.get(index).GetName() + " ");
//                    System.out.print("tipo"+ tipos.get(index).GetTipo()+ " ");
//                    System.out.print("longitud "+ longitudes.get(index).GetTipo()+ " ");
//                    System.out.print("entidad "+ tipos.get(index).GetEntity() + " ");
                    
                        
                }
                }
                
                
           /** if()
                attributos.add(new NodoETL(tipos.get(index).GetName(),tipos.get(index).GetTipo(),tipos.get(index).GetEntity());             
        atributos.add(new NodoAt(tipos.get(index).GetName(), nodo.get(index).GetTipo(),entidad));*/
        }
    }
    
    
    public ArrayList<NodoETL> getAttributos(){
        return attributos;
    }
    
    
    
    
    
    
    
        
        
        
        
        
    }
     
    



   
        
        
        
    

           


        
        
        
        
    
    
    
    

 

